drawingarea: use same background approach as GtkLayout
authorCosimo Cecchi <cosimoc@gnome.org>
Mon, 20 Jul 2015 15:21:43 +0000 (08:21 -0700)
committerCosimo Cecchi <cosimoc@gnome.org>
Mon, 20 Jul 2015 15:43:08 +0000 (08:43 -0700)
Call gtk_style_context_set_background() every time the style is updated
and add a comment as to why we still need to do it here.

https://bugzilla.gnome.org/show_bug.cgi?id=752599

gtk/gtkdrawingarea.c

index a9b659ee1c28b775ab5695bc9872f19ac962159f..36ec5b8db546b3041053806e84a8da35fa818727 100644 (file)
  */
 
 static void gtk_drawing_area_realize       (GtkWidget           *widget);
+static void gtk_drawing_area_style_updated (GtkWidget           *widget);
 static void gtk_drawing_area_size_allocate (GtkWidget           *widget,
                                             GtkAllocation       *allocation);
 static void gtk_drawing_area_send_configure (GtkDrawingArea     *darea);
@@ -126,6 +127,7 @@ gtk_drawing_area_class_init (GtkDrawingAreaClass *class)
 
   widget_class->realize = gtk_drawing_area_realize;
   widget_class->size_allocate = gtk_drawing_area_size_allocate;
+  widget_class->style_updated = gtk_drawing_area_style_updated;
 
   gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_DRAWING_AREA);
 }
@@ -148,6 +150,33 @@ gtk_drawing_area_new (void)
   return g_object_new (GTK_TYPE_DRAWING_AREA, NULL);
 }
 
+static void
+set_background (GtkWidget *widget)
+{
+  if (gtk_widget_get_realized (widget) &&
+      gtk_widget_get_has_window (widget))
+    {
+      /* We still need to call gtk_style_context_set_background() here for
+       * GtkDrawingArea, since clients expect backgrounds set on it (e.g. through
+       * gtk_widget_override_background_color) to be available even when they
+       * don't chain up from draw().
+       * This should be revisited next time we have a major API break.
+       */
+      G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
+      gtk_style_context_set_background (gtk_widget_get_style_context (widget),
+                                        gtk_widget_get_window (widget));
+      G_GNUC_END_IGNORE_DEPRECATIONS;
+    }
+}
+
+static void
+gtk_drawing_area_style_updated (GtkWidget *widget)
+{
+  GTK_WIDGET_CLASS (gtk_drawing_area_parent_class)->style_updated (widget);
+
+  set_background (widget);
+}
+
 static void
 gtk_drawing_area_realize (GtkWidget *widget)
 {
@@ -182,8 +211,7 @@ gtk_drawing_area_realize (GtkWidget *widget)
       gtk_widget_register_window (widget, window);
       gtk_widget_set_window (widget, window);
 
-      gtk_style_context_set_background (gtk_widget_get_style_context (widget),
-                                        window);
+      set_background (widget);
     }
 
   gtk_drawing_area_send_configure (GTK_DRAWING_AREA (widget));